package com.proyecto.track.action;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.ActionSupport;
import com.proyecto.track.bo.Comentario;
import com.proyecto.track.bo.EstadoTarea;
import com.proyecto.track.bo.Tarea;
import com.proyecto.track.bo.TipoTarea;
import com.proyecto.track.bo.Usuario;
import com.proyecto.track.service.IProyectoService;
import com.proyecto.track.utils.NoHayHorasDisponiblesException;

@SuppressWarnings("serial")
public class TareaAction extends ActionSupport{
	
	/** El service de proyectos */
	private IProyectoService proyectoService;
	
	private Long[] listadoIdUsuarios;
	
	/** El logger */
	private Logger log = Logger.getLogger(TareaAction.class);
	
	/** Una tarea */
	private Tarea tarea;

	/** Todos los usuarios del proyecto al cual pertenece la tarea */
	private List<Usuario> usuarios;
	
	/** Todos los estados tarea */
	private List<EstadoTarea> estadosTarea;
	
	/** Todos los tipos de tarea */
	private List<TipoTarea> tiposTarea;
	
	private List<Comentario> comentariosOrdenados;

	
	public String input() {
		log.info(this.getClass().getCanonicalName() + " - inicializando input de tarea ");
		
		
		if (tarea == null) {
		
			tarea = new Tarea();
		
		} else if (tarea.getIdTarea() != null) {
			
			tarea = proyectoService.recuperarTarea(tarea.getIdTarea());
		}
		
		inicializacionDeCombos();
		return INPUT;
	}


	private void inicializacionDeCombos() {
		estadosTarea = proyectoService.getAllEstadosTarea();
		tiposTarea = proyectoService.getAllTiposTarea();
	}
	
	
	/**
	 * Guarda o actualiza una tarea
	 * 
	 * @return el String que indica el result para struts
	 */
	public String guardar() {
		 log.info(this.getClass().getCanonicalName() + " - llamando a guardar tarea ");
         
		 if (tarea != null){
	         tarea.setTipoTarea(proyectoService.recuperarTipoTarea(tarea.getTipoTarea().getIdTipoTarea()));
	         tarea.setProyecto(proyectoService.recuperarProyecto(tarea.getProyecto().getIdProyecto()));
	         
	         try{
	                 if (tarea.getIdTarea() == null) {
	                	 proyectoService.crearTarea(tarea);
	                 } else {
	                	 proyectoService.actualizarTarea(tarea);
	                 }
	                 return SUCCESS;
	                 
	         }catch(NoHayHorasDisponiblesException e){
	                 log.error("Error al guardar la tarea", e);
	                 addActionError(e.getMessage());
	                 inicializacionDeCombos();
	                 return INPUT;
	         }
		 }
		
		return SUCCESS;
	}
	
    public String borrar() {
		log.info(this.getClass().getCanonicalName() + " - borrando tarea ");
            
		if (tarea.getIdTarea() != null) {
			getProyectoService().borrarTarea(tarea.getIdTarea());
		}
            
		return SUCCESS;
    }
    
    
    /**
	 * Muestra los detalles de una tarea
	 * 
	 * @return el String que indica el result para struts
	 */
	@SuppressWarnings("unchecked")
	public String ver() {
		comentariosOrdenados = new ArrayList<Comentario>();
		log.info(this.getClass().getCanonicalName() + "llamando a ver");

		if (tarea.getIdTarea() != null) {
			tarea = proyectoService.recuperarTarea(tarea.getIdTarea());
		}
		
		comentariosOrdenados.addAll(tarea.getComentarios());
//		for (Comentario c : tarea.getComentarios()) {
//			comentariosOrdenados.add(c);
//		}
		Collections.sort(comentariosOrdenados);
		return SUCCESS;
	}

	public String asignarRecursos() {
		log.info(this.getClass().getCanonicalName()
				+ "llamando a Asignacion de recursos");
		tarea = proyectoService.recuperarTarea(tarea.getIdTarea());
		tarea.getAsignados().clear();
		for (Long idUsuario : listadoIdUsuarios) {
			tarea.getAsignados().add(proyectoService.recuperarUsuario(idUsuario));
		}
		proyectoService.actualizarTarea(tarea);
		return SUCCESS;
	}



	public IProyectoService getProyectoService() {
		return proyectoService;
	}

	public void setProyectoService(IProyectoService proyectoService) {
		this.proyectoService = proyectoService;
	}

	public Logger getLog() {
		return log;
	}

	public void setLog(Logger log) {
		this.log = log;
	}

	public Tarea getTarea() {
		return tarea;
	}

	public void setTarea(Tarea tarea) {
		this.tarea = tarea;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<EstadoTarea> getEstadosTarea() {
		return estadosTarea;
	}

	public void setEstadosTarea(List<EstadoTarea> estadosTarea) {
		this.estadosTarea = estadosTarea;
	}

	public List<TipoTarea> getTiposTarea() {
		return tiposTarea;
	}

	public void setTiposTarea(List<TipoTarea> tiposTarea) {
		this.tiposTarea = tiposTarea;
	}


	public void setListadoIdUsuarios(Long[] listadoIdUsuarios) {
		this.listadoIdUsuarios = listadoIdUsuarios;
	}


	public Long[] getListadoIdUsuarios() {
		return listadoIdUsuarios;
	}


	public void setComentariosOrdenados(List<Comentario> comentariosOrdenados) {
		this.comentariosOrdenados = comentariosOrdenados;
	}


	public List<Comentario> getComentariosOrdenados() {
		return comentariosOrdenados;
	}

}
